<?php
    if (!defined('__IS_LEAF__')) exit('Access Denied!');

    /**
     * 记录错误日志、以及SQL日志等
     */
    class Log {

        /**
         * 记录错误
         * @access public
         * @param array $errorInfo 错误信息
         * @param string $type 错误类型（框架系统错误或应用运行错误）
         * @return void
         */
        static public function errorLogRecord($errorInfo ,$type='leaf'){
            //框架错误分两类，leaf框架本身的，和应用的，如果未定义，则默认为框架本身的
            !in_array($type, array('leaf','app')) && ($type='leaf');
            //定义三种级别的错误，256、512,1024正好是错误type中的严重错误、警告错误、注意错误
            $errno=array(256=>L('error_fatal'),1024=>L('error_warning'),512=>L('error_notice'));
            switch ($type) {
                case 'leaf':
                    //输出换行，必须是上引号包裹\n\r。
                    $msg = date('Y-m-d H:i:s').' '.$errno[$errorInfo['type']].'：'.$errorInfo['message'].'（'.$errorInfo['file'].'——'.L('line').$errorInfo['line']."）\r\n";
                    $file = __LEAF_COMMON__.__SP__.'log'.__SP__.'error_log.txt';;
                    self::log_put_contents($file, $msg);
                    break;
                default:
                    break;
            }
        }

        /**
         * 记录sql查询状态，如sql语句、sql查询时间，占用内存
         * 此项，只有
         * @access public
         * @param array $queryStat 查询总状态
         * @return void
         */
        static public function sqlLogRecord($queryStat){
            /*
            *********************************************************************************
             * InitPHP 3.3 国产PHP开发框架  Dao-dao Dao基类
             *-------------------------------------------------------------------------------
             * 版权所有: CopyRight By initphp.com
             * 您可以自由使用该源码，但是在使用过程中，请保留作者信息。尊重他人劳动成果就是尊重自己
             *-------------------------------------------------------------------------------
            ***********************************************************************************
            */
            $msg = '*********************************************************************************'."\r\n";
            $msg .= ' * '.date('Y-m-d H:i:s').'：本次查询总处理时间 '.$queryStat['total']['run_time'].'秒，总内存占用 '.$queryStat['total']['mem_usage'].'K，请求地址 '.__URL__." \r\n";
            foreach ($queryStat as $key => $value) {
                if($key==='total'){
                    continue;
                }
                $msg .= ' * -------------------------------------------------------------------------------'."\r\n";
                $msg .= ' * '.$key.'查询总用时：'.$value['run_time'].'秒，内存占用：'.$value['mem_usage']."K \r\n";
                krsort($value['detail'] );
                foreach ($value['detail'] as $keydetail => $valuedetail) {
                    //$msg .= ' * -------------------------------------------------------------------------------'."\r\n";
                    $msg .= ' * 用时：'.$valuedetail['run_time'].'s，内存占用：'.$valuedetail['mem_usage'].'，SQL：'.$valuedetail['sql']."\r\n";
                }
            }
            $sqlLogFile = __LEAF_COMMON__.__SP__.'log'.__SP__.'sql_log.txt';
            self::log_put_contents($sqlLogFile, $msg);
        }

        /**
         * 向文件中写入日志信息
         * @access private
         * @param string $file 要写入的文件
         * @param string $msg  待写入的信息
         * @param string $flag 标志位，可选值为'begin'、'end'，即，写入文件开头还是结尾
         */
        static private function log_put_contents($file, $msg, $flag='begin'){
            //$fileExists，判断日志文件是否存在，用来判断是否需要重命名已存在文件
            if( !$fileExists = file_exists_case($file) ){
                touch($file);
            }
            //打开文件
            if($flag==='begin'){
                //将源文件重命名为临时文件
                if( $fileExists && rename($file, $tmpFile=$file.'.tmp') ){
                    //打开临时文件
                    $tmpHandle = fopen($tmpFile, 'r');
                    //打开新文件
                    $handler = fopen($file, 'r+');
                    //
                    flock($tmpHandle, LOCK_SH);
                    while ( feof($tmpHandle) ) {
                        # code...
                    }
                    fwrite($tmpHandle, $msg);
                    flock($tmpHandle, LOCK_UN);
                    fclose($tmpHandle);
                }
            }else{
                error_log($msg, 3, $file);
            }
        }

    }